課題1 課題2 課題3 参考文献

課題1

tcpv6cはIPv4とIPv6の両方に対応しているにもかかわらず、tcpc (IPv4のみに対応)よりコードが短い。この理由は何故か説明せよ。

tcpc.cのソース tcpv6c.cのソース

説明

tcpc.c

atoi(),inet_addr(),gethostbyname(),getservbyname()の 4種類の関数が使われている。

関数の説明

---------atoi()-------------------------------------------------

atoi()関数は、nptr によって指示される文字列のはじめの部分を int 型整数に変換する。

---------inet_addr()------------------------------------------

ホストアドレスを表す文字列を,ネットワークバイト順序のバイナリ値へ

---------gethostbyname()-----------------------------------

関数は与えられたホスト名 name に対応する構造体 hostent を返す。

---------getservbyname()-----------------------------------

サービス名からポート番号を取得

tcpv6.c

getaddrinfo()関数が使われている。

コードが短い理由

getaddrinfo()関数は"tcpc.c"で使われている4種類の関数の機能をまとめて出来る関数なので、この関数によって 使う関数が少なくなるので、コードが短くなる。

課題2

tcpv6sはAF_INET6でソケットをオープンしているにもかかわらず、IPv4でも通信できる。この理由は何故か説明せよ。

説明

IPv6でIPv4と同じ様に通信できるのは、IPv6がIPv4との間に互換性を持っているからである。 IPv6アドレスは16進数で表記され4桁ごとに区切られているて、IPv6アドレスの中には、IPv4射影ア ドレスと呼ばれるIPv6アドレスが存在して、それを使って下位32ビットにIPv4のアドレスを埋め込む ことでIPv4にも対応している。

課題3

サンプルプログラム(2)のクライアント(tcpc2.c)とサーバ(tcps2.c)をアドレスファミリ独立となるように書き換えよ。

ソース

tcpc.c tcps.c

実行結果

"tcps.c"

[nw0546:~/jikken2/tcp4] j05046% ./tcps 8000

"tcpc.c"

[nw0546:~/jikken2/tcp4] j05046% ./tcpc 2001:02f8:001c:d048:0211:24ff:fe90:fea8 8000 trying 2001:2f8:1c:d048:211:24ff:fe90:fea8 port 8000
Hello 2001:2f8:1c:d048:211:24ff:fe90:fea8

[nw0546:~/jikken2/tcp4] j05046% ./tcpc 133.13.59.46 8000
trying 133.13.59.46 port 8000
Hello ::ffff:133.13.59.46

参考文献

  • Index of /JM/html/LDP_man-pages/man3
  • 【C言語講座】標準ライブラリ関数